package sort;

import java.util.Arrays;

/**
 * 基数排序
 */
public class RadixSort {
    public static void main(String[] args) {
        int[] arr = {53, 3, 542, 748, 14, 214};
        radixSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void radixSort(int[] arr) {
        //因为基数排序的循环次数需要根据最大数的位数来决定，所以需要先找到最大数
        int max = arr[0];//假设第一个是最大值
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }

        //创建10个桶
        int[][] bucket = new int[10][arr.length];
        //为了记录每个桶都装了多少个数据，创建一个数组用于记录个数
        int[] bucketElementCounts = new int[10];
        //得到最大的数的长度
        int maxLength = (max + "").length();
        //循环maxLength次，每次循环都把数放入对应的桶中
        for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {
            //遍历数组，把数放入对应的桶中
            for (int j = 0; j < arr.length; j++) {
                //得到当前数的第i+1位
                int digit = arr[j] / n % 10;
                bucket[digit][bucketElementCounts[digit]] = arr[j];
                bucketElementCounts[digit]++;
            }
            //把数据从桶中取出来之后放回原数组
            int index = 0;
            for (int j = 0; j < bucketElementCounts.length; j++) {
                for (int k = 0; k < bucketElementCounts[j]; k++) {
                    arr[index] = bucket[j][k];
                    index++;
                }
            }
            //存储好之后，需要把个数都记成0
            for (int j = 0; j < bucketElementCounts.length; j++) {
                bucketElementCounts[j] = 0;
            }

        }
    }
}
